Go并发读写文件、分片写、分片下载文件(实用版)

您所在的位置:网站首页 golang 文件上传 Go并发读写文件、分片写、分片下载文件(实用版)

Go并发读写文件、分片写、分片下载文件(实用版)

2024-07-15 22:11| 来源: 网络整理| 查看: 265

 倾心分享,如有帮助,欢迎留下足迹~

目录

简单读取

读取&分片写

读取文件流+分片写-1

读取文件流+分片写-2

读取文件流+并发分片写

更好用的方法

http并发、分片下载

简单读取 func ReadFile(filePath string) (chunks []byte, err error) { f, err := os.Open(filePath) if err != nil { return } defer f.Close() reader := bufio.NewReader(f) for { dataByte := make([]byte, 5*1024) var n int n, err = reader.Read(dataByte) if err != nil || 0 == n { break } chunks = append(chunks, dataByte[:n]...) fmt.Printf("file: %s, len(chunks):%v", filePath, len(chunks)) } isEOF := strings.Compare(err.Error(), "EOF") if isEOF == 0 { err = nil fmt.Printf("read %s success: \n, len=%v", filePath, len(chunks)) return } fmt.Printf("readFile over") return }

一般情况下已经可以满足,但如文件较大,chunks会变得很大。

读取&分片写 读取文件流+分片写-1 var bufLen = 2 * 1024 * 1024 func DownLoadFileShardByFilePath1(writerFilePath string, body io.Reader) (err error) { f, err := os.OpenFile(writerFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModeAppend) defer f.Close() if err != nil { fmt.Println("open err:" + err.Error()) return } writer := bufio.NewWriter(f) bs := make([]byte, bufLen) for { var read int read, err = body.Read(bs) if err != nil || 0 == read { break } _, err = writer.Write(bs[:read]) if err != nil { fmt.Println("write err:" + err.Error()) break } } if err == io.EOF { err = nil } if err != nil { return } if err = writer.Flush(); err != nil { fmt.Println("writer flush err: ", err.Error()) return } fmt.Printf("downLoad over") return } 读取文件流+分片写-2 var bufLen = 2 * 1024 * 1024 func DownLoadFileShard(writerFilePath string, body io.Reader) (err error) { f, err := os.OpenFile(writerFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModeAppend) if err != nil { fmt.Println("open err:" + err.Error()) return } defer f.Close() bs := make([]byte, bufLen) writer := bufio.NewWriter(f) for { var read int switch read, err = body.Read(bs[:]); true { case read < 0: fmt.Println("read err: ", err.Error()) return case read == 0, err == io.EOF: fmt.Printf("downLoad over") return writer.Flush() case read > 0: _, err = writer.Write(bs[:read]) if err != nil { fmt.Println("write err:" + err.Error()) return } } } return } 读取文件流+并发分片写 type FileShard struct { Data []byte Err error Code int // 0-正常 -1=失败 } var bufLen = 2 * 1024 * 1024 func DownLoadFileShardCon(writerFilePath string, body io.Reader) (err error) { writerFile, err := os.OpenFile(writerFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModeAppend) if err != nil { fmt.Println("open err:" + err.Error()) return } defer writerFile.Close() ch, complete := make(chan *FileShard), make(chan struct{}) go func() { writer := bufio.NewWriter(writerFile) youKnow: for { select { case data :=


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3